package com.ruoyi.system.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.system.entity.QnnQuestionnaire;
import com.ruoyi.system.vo.QuestionnaireVO;
import com.ruoyi.system.vo.SubmitAnswerVO;
import java.util.List;
import java.util.Map;
import com.ruoyi.system.dto.QuestionnaireQueryDTO;

public interface QnnQuestionnaireService extends IService<QnnQuestionnaire> {
    // 创建问卷（包含问题和选项）
    Long createQuestionnaire(QuestionnaireVO questionnaireVO);

    // 更新问卷
    boolean updateQuestionnaire(QuestionnaireVO questionnaireVO);

    // 根据ID获取问卷详情（包含问题和选项）
    QnnQuestionnaire getQuestionnaireDetail(Long id);

    // 发布问卷
    boolean publishQuestionnaire(Long id);

    // 结束问卷
    boolean endQuestionnaire(Long id);

    // 提交问卷答案
    Long submitAnswer(SubmitAnswerVO submitAnswerVO);

    // 统计投放量（选择的客户数）
    long countDeliveryUsers(Long questionnaireId);

    // 统计填写量（有效提交数）
    long countValidSubmits(Long questionnaireId);

    // H5 可访问校验（发布、时间窗口、投放范围）；通过返回true，否则抛异常
    default void assertH5Accessible(QnnQuestionnaire q, String userId) {
        if (q == null || q.getStatus() == null || q.getStatus() != 1) {
            throw new RuntimeException("问卷未发布或不存在");
        }
        if (q.getStartTime() != null && q.getStartTime().isAfter(java.time.LocalDateTime.now())) {
            throw new RuntimeException("问卷未到开始时间");
        }
        if (q.getEndTime() != null && q.getEndTime().isBefore(java.time.LocalDateTime.now())) {
            throw new RuntimeException("问卷已过期");
        }
        if (q.getScopeType() != null && q.getScopeType() == 1) {
            // 指定客户范围：需要存在范围绑定
            // 具体校验可在controller调用mapper判断；此处仅保留接口默认实现（可被覆盖）
        }
    }

    // H5：按模块查询用户可见问卷（分页）
    List<QnnQuestionnaire> listAvailableForUserByModule(String userId, Integer module, Integer offset, Integer limit);

    // H5：按模块汇总可见问卷数量
    Map<Integer, Long> summaryAvailableByModules(String userId, List<Integer> modules);

    // Admin：多条件分页查询
    List<QnnQuestionnaire> queryAdminList(QuestionnaireQueryDTO dto);
    long queryAdminCount(QuestionnaireQueryDTO dto);
}
